package com.ehsy.statement;

import com.dtflys.forest.Forest;
import com.dtflys.forest.config.ForestConfiguration;
import com.dtflys.forest.exceptions.ForestRuntimeException;
import com.dtflys.forest.http.ForestRequest;
import com.dtflys.forest.http.ForestResponse;
import com.ehsy.common.ResponseVo;
import com.ehsy.model.UserInfo;
import com.ehsy.service.CallbackService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;

/**
 * @author YanZhen_Li
 * @version 1.0
 * @title A16回调函数
 * @description
 * @create 2024/6/19 10:06
 */
@SpringBootTest
public class A16回调函数 {
    @Resource
    CallbackService service;

    /**
     * 请求成功/失败回调函数
     */
    @Test
    public void test1() {
        String test01 = service.test01(200, (String resText, ForestRequest request, ForestResponse response) -> {
                    // 成功响应回调
                    System.out.println("test01请求成功了，内容是：" + resText);
                },
                (ForestRuntimeException ex, ForestRequest request, ForestResponse response) -> {
                    // 异常回调
                    System.out.println("test01请求失败了");
                });


        String test02 = service.test01(500, (String resText, ForestRequest request, ForestResponse response) -> {
                    // 成功响应回调
                    System.out.println("test02请求成功了，内容是：" + resText);
                },
                (ForestRuntimeException ex, ForestRequest request, ForestResponse response) -> {
                    // 异常回调
                    System.out.println("test02请求失败了");
                });
        System.out.println("------------------------------------");
        System.out.println(test01);
        System.out.println(test02);
    }

    /**
     * 下载进度回调函数
     */
    @Test
    public void test2() throws IOException {
        // ! 因为我在后台为了方式传输过快，定义了一个每秒传输速度不能大于500kb，所以我这里需要设置超时时间长一点，防止太长时间没响应导致了超时
        // 创建Forest配置对象
        ForestConfiguration configuration = Forest.config();
        // 设置连接超时时间（单位：毫秒）
        configuration.setConnectTimeout(10000);
        // 设置读取超时时间（单位：毫秒）
        configuration.setReadTimeout(10000);

        byte[] test02 = service.test02("bg.png", progress -> {
            System.out.println("------------------------------------------");
            System.out.println("总字节: " + progress.getTotalBytes()); // 文件总字节数
            System.out.println("已传输字节: " + progress.getCurrentBytes()); // 当前已传输字节数
            System.out.println("传输百分比: " + Math.round(progress.getRate() * 100) + "%"); // 传输百分百
            if (progress.isDone()) {
                // 若已传输完毕
                System.out.println("--------   Download Completed!   --------");
            }
        });
        File file = new File("D:\\logs\\bg.png");
        if (!file.exists()){
            boolean newFile = file.createNewFile();
        }
        OutputStream outputStream = Files.newOutputStream(file.toPath());
        outputStream.write(test02);
        outputStream.close();
        System.out.println("------------------------------------");
        System.out.println(test02);
    }

    /**
     * 重定向回调函数
     */
    @Test
    public void test3() {
        ForestResponse<String> test3 = service.test3("程咬金", (redirectReq, prevReq, prevRes) -> {
            // prevReq 为跳转前的请求对象
            // prevRes 为跳转前接受到的响应对象
            // redirectReq 为新的即将跳转的请求对象
        });
        System.out.println(test3);
    }
}
